package com.kkb.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.SoftException;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

//切面类（advice,pointcut）
@Aspect
//@Component
public class MyAspect {

    @Pointcut("execution(* com.kkb.service.*.*(..))")
    private void pointcut(){}

    @Before("pointcut()")
    public void before(JoinPoint joinPoint){//joinPoint指代要处理的目标对象的方法
        System.out.println("前置通知：在目标对象方法执行之前执行：");
        System.out.println("拦截到要处理的方法的名字：");
        String name = joinPoint.getSignature().getName();//要处理方法的名字
        System.out.println("方法名："+name);
        System.out.println("拦截到要处理的方法的参数：");
        Object[] args = joinPoint.getArgs();
        for (Object arg : args){
            System.out.println("参数："+arg);
        }
    }
//后置通知：目标对象方法执行结束以后，执行后置通知（可以提交事务，也可以获得当前方法的返回值）
    @AfterReturning(value = "execution(* com.kkb.service.ipl.UserServiceImpl.findUserById(..))",returning ="result" )
    public void afterReturning(Object result){
        System.out.println("后置通知：获得目标对象方法的返回值");
        System.out.println(result);
    }
//异常通知：只有当目标对象的方法，出现异常，才执行异常通知，反之没有异常，不执行该通知
    @AfterThrowing(value = "pointcut()",throwing = "ex")
    public void exception(JoinPoint joinPoint,Throwable ex){
        System.out.println(joinPoint.getSignature()+"方法抛出异常");
        System.out.println(ex.getMessage());
    }

//环绕通知：在目标对象的方法执行前后分别执行
   @Around("pointcut()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
       System.out.println("环绕通知----------------------------目标对象方法执行之前");
//执行目标对象的方法
       Object result = proceedingJoinPoint.proceed();
       System.out.println("环绕通知----------------------------目标对象方法执行之后");
       return result+"，孟庭苇";
   }

//最终通知： 最后被执行
    @After("pointcut()")
    public void myAfter(){
        System.out.println("最后她还是走了。。。");
    }
}
